package com.itic.appbase.framework.utils;

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JPanel;

import com.itic.appbase.applications.files.utils.FileHelper;


public class ScreenCaptureHelper {
	 // test main
	/*
	public static void main(String[] args) throws Exception {
		    //String userdir = System.getProperty("user.dir");
		    //String rootDir = FileHelper.getRootDir();
		    File tempFile = new File("D://phpStudy//WWW//", "temp.png");
		    ScreenCaptureHelper capture = ScreenCaptureHelper.getInstance();
		    capture.captureImage();
		    
		    //JFrame frame = new JFrame();
		   // JPanel panel = new JPanel();
		   // panel.setLayout(new BorderLayout());
		    //JLabel imagebox = new JLabel();
		    //panel.add(BorderLayout.CENTER, imagebox);
		    //imagebox.setIcon(capture.getPickedIcon());
		    capture.saveToFile(tempFile);
		  //  capture.captureImage();
		   // imagebox.setIcon(capture.getPickedIcon());
		   // frame.setContentPane(panel);
		   // frame.setSize(400, 300);
		    //frame.show();
		    //System.out.println("Over");
		    
	  }*/
	  
	  public static String cut(){
		    String path = "";
		    String rootDir = FileHelper.getRootDir();
		    Date date = new Date();
		    String dataString = DateHelper.getDateStringByDate(date, "yyyy-MM-dd")+"/";
		    
		    String imgName = IdGen.uuid()+".png";
		    File tempFile = new File(rootDir+dataString, imgName);
		    if (!tempFile.getParentFile().exists()) {//判断父文件夹是否存在
		    	tempFile.getParentFile().mkdirs();
            }
		    ScreenCaptureHelper capture = ScreenCaptureHelper.getInstance();
		    capture.captureImage();
		    try {
				capture.saveToFile(tempFile);
				path = FileHelper.getDownloadPath()+dataString + imgName;
			} catch (IOException e) {
				e.printStackTrace();
				path="fail";
			}
		    return path;
	  }
	  
	  private ScreenCaptureHelper() {
		    try {
		      robot = new Robot();
		    } catch (AWTException e) {
		      System.err.println("Internal Error: " + e);
		      e.printStackTrace();
		    }
		    JPanel cp = (JPanel) dialog.getContentPane();
		    cp.setLayout(new BorderLayout());
		    labFullScreenImage.addMouseListener(new MouseAdapter() {
		      public void mouseReleased(MouseEvent evn) {
		        isFirstPoint = true;
		        pickedImage = fullScreenImage.getSubimage(recX, recY, recW,
		            recH);
		        dialog.setVisible(false);
		      }
		    });
		    labFullScreenImage.addMouseMotionListener(new MouseMotionAdapter() {
		      public void mouseDragged(MouseEvent evn) {
		        if (isFirstPoint) {
		          x1 = evn.getX();
		          y1 = evn.getY();
		          isFirstPoint = false;
		        } else {
		          x2 = evn.getX();
		          y2 = evn.getY();
		          int maxX = Math.max(x1, x2);
		          int maxY = Math.max(y1, y2);
		          int minX = Math.min(x1, x2);
		          int minY = Math.min(y1, y2);
		          recX = minX;
		          recY = minY;
		          recW = maxX - minX;
		          recH = maxY - minY;
		          labFullScreenImage.drawRectangle(recX, recY, recW, recH);
		        }
		      }
		      public void mouseMoved(MouseEvent e) {
		        labFullScreenImage.drawCross(e.getX(), e.getY());
		      }
		    });
		    cp.add(BorderLayout.CENTER, labFullScreenImage);
		    dialog.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
		    dialog.setAlwaysOnTop(true);
		    dialog.setMaximumSize(Toolkit.getDefaultToolkit().getScreenSize());
		    dialog.setUndecorated(true);
		    dialog.setSize(dialog.getMaximumSize());
		    dialog.setModal(true);
		  }
		  // Singleton Pattern
		  public static ScreenCaptureHelper getInstance() {
		    return defaultCapturer;
		  }
		  /** 捕捉全屏慕 */
		  public Icon captureFullScreen() {
		    fullScreenImage = robot.createScreenCapture(new Rectangle(Toolkit
		        .getDefaultToolkit().getScreenSize()));
		    ImageIcon icon = new ImageIcon(fullScreenImage);
		    return icon;
		  }
		  /** 捕捉屏幕的一个矫形区域 */
		  public void captureImage() {
		    fullScreenImage = robot.createScreenCapture(new Rectangle(Toolkit
		        .getDefaultToolkit().getScreenSize()));
		    ImageIcon icon = new ImageIcon(fullScreenImage);
		    labFullScreenImage.setIcon(icon);
		    dialog.setVisible(true);
		  }
		  /** 得到捕捉后的BufferedImage */
		  public BufferedImage getPickedImage() {
		    return pickedImage;
		  }
		  /** 得到捕捉后的Icon */
		  public ImageIcon getPickedIcon() {
		    return new ImageIcon(getPickedImage());
		  }
		  /**
		   * 储存为一个文件,为PNG格式
		   * 
		   * @deprecated replaced by saveAsPNG(File file)
		   **/
		  @Deprecated
		  public void saveToFile(File file) throws IOException {
		    ImageIO.write(getPickedImage(), defaultImageFormater, file);
		  }
		  /** 储存为一个文件,为PNG格式 */
		  public void saveAsPNG(File file) throws IOException {
		    ImageIO.write(getPickedImage(), "png", file);
		  }
		  /** 储存为一个JPEG格式图像文件 */
		  public void saveAsJPEG(File file) throws IOException {
		    ImageIO.write(getPickedImage(), "JPEG", file);
		  }
		  /** 写入一个OutputStream */
		  public void write(OutputStream out) throws IOException {
		    ImageIO.write(getPickedImage(), defaultImageFormater, out);
		  }
		  // singleton design pattern
		  private static ScreenCaptureHelper defaultCapturer = new ScreenCaptureHelper();
		  private int x1, y1, x2, y2;
		  private int recX, recY, recH, recW; // 截取的图像
		  private boolean isFirstPoint = true;
		  private BackgroundImage labFullScreenImage = new BackgroundImage();
		  private Robot robot;
		  private BufferedImage fullScreenImage;
		  private BufferedImage pickedImage;
		  private String defaultImageFormater = "png";
		  private JDialog dialog = new JDialog();
}
